/*
 ============================================================================
 Name        : projetC.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */




#include "joueur.h"
#include "projetC.h"
#include "niveau.h"
#include "explosion.h"
#include "menu.h"



/* la variable qui controle le temps réel */
volatile int game_time;


/* La variable qui compte les secondes de jeu depuis le début */
volatile unsigned long sec_counter;


/* le timer pour ajuster la vitesse du jeu */
void game_timer(void) {
	game_time++;
}
END_OF_FUNCTION(game_timer);

void lancer_menu1() ;
void lancer_niveau1(BITMAP* buffer) ;


/* le timer qui donne le nombre de secondes du jeu */
void game_sec_timer(void) {
	sec_counter++;
}
END_OF_FUNCTION(game_sec_timer);


int init_timer(void) {
	install_timer();
	/* Résolution : 2 ms */
	if (install_int(game_timer, 3 )  < 0)
		return 1;
	/* Résolution : 1 s */
	if (install_int(game_sec_timer, 1000) < 0)
		return 1;
	sec_counter = 0;
	game_time = 0;
	LOCK_VARIABLE(game_time);
	LOCK_VARIABLE(sec_counter);
	LOCK_FUNCTION(game_timer);
	LOCK_FUNCTION(game_sec_timer);
	return 0;
}



SAMPLE *sample2;
int main() {

	allegro_init() ;
	install_keyboard() ;
	install_mouse() ;

	if(install_mouse() == -1) {
		allegro_message("Erreur ! %s", allegro_error) ;
		return-1 ;
	}

    if (install_sound(DIGI_AUTODETECT, MIDI_NONE, "") != 0)
    {
        allegro_message("Error initializing sound system");
        return;
    }

	if (init_timer() != 0) {
		allegro_message("Erreur lors de l'initialisation des timers!");
		return 1;
	}
	set_color_depth(16) ;
	set_gfx_mode(GFX_AUTODETECT_WINDOWED, LARGEUR_FENETRE, HAUTEUR_FENETRE, 0, 0) ;

	if(set_gfx_mode(GFX_AUTODETECT_WINDOWED, LARGEUR_FENETRE, HAUTEUR_FENETRE, 0, 0) != 0) {

		set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
		allegro_message("Impossible d’initialiser le mode vidéo !\n%s\n", allegro_error);
		return 1;
	}
    int panning = 128;
    int pitch = 1000;
    int volume = 256;

    SAMPLE *sample;
    sample = load_sample("musique/shrooms.wav");
    sample2 = load_sample("musique/jump.wav");
    if (!sample)
    {
        allegro_message("Error reading wave file");
        return;
    }
    play_sample(sample, volume, panning, pitch, TRUE);

	BITMAP* buffer;
	buffer = create_bitmap(LONGEUR_NIVEAU*TAILLE_BLOC, SCREEN_H) ;
	//menu m = lancer_menu() ;
	/*
	int lancer_jeu = ((mouse_b & 1) && mouse_y>200 && mouse_y<210 && mouse_x>70 && mouse_x<90 || key[KEY_SPACE]) ;
	while(!key[KEY_SPACE]) {

		clear_bitmap(buffer) ;
		afficher_menu(buffer,m,0) ;
		blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H) ;
	}

	 */
	lancer_niveau1(buffer) ;
	//liberer_menu(m) ;


	destroy_bitmap(buffer);
	return 0;
}
END_OF_MAIN() ;


void lancer_niveau1(BITMAP* buffer) {

	int decalage = 0 ;
	char carte[LONGEUR_NIVEAU][NB_BLOCS_HAUTEUR] ;
	niveau v = init_niveau() ;
	joueur j = init_joueur();

	charger_niveau(carte,1) ;
	afficher_objet(carte,buffer,v.objet);
	afficher_joueur(j,buffer, carte,decalage);

	int quitter_le_jeu = 0 ;
	int fin_de_niveau = 0 ;
	int nb = 0 ;
	BITMAP* pic ;
	pic = load_bitmap("./images/pic_gauche.bmp",NULL) ;
	int *a = 0 ;
	while(!(quitter_le_jeu || fin_de_niveau)) {

		if (key[KEY_ESC]) {
			quitter_le_jeu = 1 ;
		}



		while(game_time > 0){

			gravite(j, carte);

			int nb2 = game_time ;


			if (nb2==nb+1) {
				if (decalage+SCREEN_W<LONGEUR_NIVEAU*TAILLE_BLOC) {

					decalage ++ ;
				}
			}

			if (key[KEY_D]) {
				if (decalage+SCREEN_W<LONGEUR_NIVEAU*TAILLE_BLOC) {

					decalage ++ ;
				}
			}
			if (key[KEY_Q]) {
				if (decalage>0) {
					decalage -- ;
				}

			}


			if (*j.ensaut == 1){
				if (*j.bonus%2==0) {
					*j.est_freestyle = 1 ;
				}
				if ((*j.pos_y > *j.pos_y0 - *j.saut) && (collision_haut_tous(j,carte)!=1) && *j.pos_y>0){
					(*j.pos_y)-= 1;
				}
				else {
					*j.ensaut = 0;
					*j.est_freestyle = 0 ;
				}
			}
			if (key[KEY_SPACE] && (*j.pos_y >= (NB_BLOCS_HAUTEUR-1)*TAILLE_BLOC || collision_bas_tous(j,carte)==1) ){
				*j.ensaut = 1;
				int panning = 128;
				    int pitch = 1000;
				    int volume = 256;
				play_sample(sample2, volume, panning, pitch, FALSE);
				*j.pos_y0 = *j.pos_y;

				if (key[KEY_RIGHT] && collision_droite_tous(j,carte)!=1 && *j.pos_x<(SCREEN_W+decalage-LARGEUR_JOUEUR)){
					*j.direction = DROITE;

					deplacer_droite(j);
				}
				else if (key[KEY_LEFT] && collision_gauche_tous(j,carte)!=1){
					*j.direction = GAUCHE;
					deplacer_gauche(j);
				}
				else {
					*j.direction = NODIR;
				}
			}

			if (key[KEY_RIGHT] && collision_droite_tous(j,carte)!=1 && *j.pos_x<(SCREEN_W+decalage-LARGEUR_JOUEUR)) {
				*j.direction = DROITE;
				deplacer_droite(j);
			}

			if (key[KEY_LEFT] && collision_gauche_tous(j,carte)!=1) {
				*j.direction = GAUCHE;
				deplacer_gauche(j);
			}
			--game_time;
		}

		clear_bitmap(buffer);

	//	blit(v.decor,buffer,0,0,0,0,(v.decor)->w,(v.decor)->h) ;

		//	blit(v.decor,buffer,0,0,0,0,(v.decor)->w,(v.decor)->h) ;
		afficher_objet(carte,buffer,v.objet);
		afficher_joueur(j,buffer, carte,decalage);
		//afficher_all_explosion(buffer,tab1) ;
		//	draw_sprite(buffer,e1.image_explosion,*e1.pos_x,*e1.pos_y) ;
		draw_sprite(buffer,pic,decalage,0);


		nb = game_time ;

		if (*j.mort==1) {
			while (!key[KEY_ESC]) {
				blit(buffer, screen, decalage, 0, 0, 0, SCREEN_W, SCREEN_H);
			}
			quitter_le_jeu = 1 ;

		}
		blit(buffer, screen, decalage, 0, 0, 0, SCREEN_W, SCREEN_H);

		if (decalage+SCREEN_W==LONGEUR_NIVEAU*TAILLE_BLOC && *j.pos_x==SCREEN_W+decalage-LARGEUR_JOUEUR) {
			fin_de_niveau = 1 ;
		}

	}
	liberer_joueur(j);
	liberer_niveau(v) ;

}



